import { isNullOrUndef } from '@/utils/is';

const prefixKey = 'CMS_'

class Storage {
    constructor(option) {
        this.storage = option.storage;
        this.prefixKey = option.prefixKey;
    }

    getKey(key) {
        return `${this.prefixKey}${key}`.toUpperCase();
    }

    set(key, value, expire) {
        const stringData = JSON.stringify({
            value,
            time: Date.now(),
            expire: !isNullOrUndef(expire) ? new Date().getTime() + expire * 1000 : null
        });
        this.storage.setItem(this.getKey(key), stringData);
    }

    get(key) {
        const { value } = this.getItem(key, {});
        return value;
    }

    getItem(key, def = null) {
        const val = this.storage.getItem(this.getKey(key));

        if (!val) return def;

        try {
            const data = JSON.parse(val);
            const { value, time, expire } = data;

            if (isNullOrUndef(expire) || expire > new Date().getTime()) {
                return { value, time };
            }

            this.remove(key);
            return def;
        } catch (error) {
            this.remove(key);
            return def;
        }
    }

    remove(key) {
        this.storage.removeItem(this.getKey(key));
    }

    clear() {
        this.storage.clear();
    }
}

function createStorage({ prefixKey = '', storage = sessionStorage }) {
    return new Storage({ prefixKey, storage });
}

export { createStorage };

export const createLocalStorage = function (option = {}) {
    return createStorage({
        prefixKey: option.prefixKey || '',
        storage: localStorage,
    })
}

export const createSessionStorage = function (option = {}) {
    return createStorage({
        prefixKey: option.prefixKey || '',
        storage: sessionStorage,
    })
}

export const lStorage = createLocalStorage({ prefixKey })

export const sStorage = createSessionStorage({ prefixKey })